package leetcode_滑动窗口;

/**
 * 元音辅音字符串计数 I
 * 算法: 滑动窗口
 * 2025/03/12 每日一题
 *
 * @author yezh
 * @date 2025/3/12 14:25
 */
public class _3305 {

    public int countOfSubstrings_upgrade(String word, int k) {
        // 枚举右端点
        // 至少包含 k 个辅音的子字符串的数量(至少 k 个 = 恰好有 k 个 + 至少有 k + 1 个)
        // 至少包含 k + 1 个辅音的子字符串的数量
        char[] s = word.toCharArray();
        int ans = 0;
        int cntConsoants1 = 0, cntConsoants2 = 0;
        int sizeVowel1 = 0, sizeVowel2 = 0;
        int[] cntVowel1 = new int[5], cntVowel2 = new int[5];
        int left1 = 0, left2 = 0;
        for (char c : s) {
            int i = "aeiou".indexOf(c);
            if (i >= 0) {
                if (cntVowel1[i] == 0) ++sizeVowel1;
                if (cntVowel2[i] == 0) ++sizeVowel2;
                cntVowel1[i]++;
                cntVowel2[i]++;
            } else {
                cntConsoants1++;
                cntConsoants2++;
            }

            while (cntConsoants1 >= k && sizeVowel1 == 5) {
                i = "aeiou".indexOf(s[left1]);
                if (i >= 0) {
                    cntVowel1[i]--;
                    if (cntVowel1[i] == 0) sizeVowel1--;
                } else cntConsoants1--;
                left1++;
            }

            while (cntConsoants2 >= k + 1 && sizeVowel2 == 5) {
                i = "aeiou".indexOf(s[left2]);
                if (i >= 0) {
                    cntVowel2[i]--;
                    if (cntVowel2[i] == 0) sizeVowel2--;
                } else cntConsoants2--;
                left2++;
            }

            ans += left1 - left2;
        }
        return ans;
    }

    public int countOfSubstrings(String word, int k) {
        // 枚举右端点
        // 至少包含 k 个辅音的子字符串的数量(至少 k 个 = 恰好有 k 个 + 至少有 k + 1 个)
        // 至少包含 k + 1 个辅音的子字符串的数量
        char[] s = word.toCharArray();
        return f(s, k) - f(s, k + 1);
    }

    int f(char[] s, int k) {
        int ans = 0, consoants = 0, vowels = 0, left = 0;
        int[] cnt = new int[5];
        for (char c : s) {
            int i = "aeiou".indexOf(c);
            if (i >= 0) {
                if (cnt[i] == 0) ++vowels;
                cnt[i]++;
            } else consoants++;
            while (consoants >= k && vowels == 5) {
                i = "aeiou".indexOf(s[left]);
                if (i >= 0) {
                    --cnt[i];
                    if (cnt[i] == 0) --vowels;
                } else --consoants;
                ++left;
            }
            ans += left;
        }
        return ans;
    }

}
